Message Queue [system call]

Message Queue <sys/msg.h>
먼저 들어간 데이터는 먼저 나옴(FIFO)

부모-자식 프로세스간이 아닌 모든 프로세스간의 소통 가능

typedef struct msgbuf{
  long type;
  char text[50];
}MsgBuf;

msgbuf 단위로 메세지 전송 할 수 있다.
메세지 큐 생성
msqid=msgget(key, msgflg); // key: , msgflg
msgflg
IPC_CREAT: 새로운 키면 식별자를 새로 생성, IPC_CREAT|접근권한
ex) IPC_CREAT|0644: rw-r—r--
메세지 전송
msgsnd(msqid, &sbuf, buf_length, msgflg);
msgflg
0: 블록 모드        //메세지를 읽을때까지 msgsnd 이 후 명령어 처리 x
IPC_NOWAIT: 비블록 모드
메세지 수신, ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
msgrcv(msqid, &rbuf, MSGSZ, 1, 0) //msgrcv
msgtype
0이면 첫번째 메세지, 양수이면 타입이 일치하는 첫번째 메세지

msgflg
0: 블록 모드
IPC_NOWAIT: 비블록 모드
메세지 삭제(컨트롤)
msgctl(msgid, IPC_RMID, 0);
//
msgqueuesnd.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>
typedef struct msgbuf{
long type;
char text[50];
}MsgBuf;
int main(void){
int msgid, len;
MsgBuf msg;
key_t key=1234;
msgid=msgget(key, IPC_CREAT|0644);
if(msgid==-1){
perror("msgget");
exit(1);
}
msg.type=1;
strcpy(msg.text, "Hello Message Queue\n");
if(msgsnd(msgid, (void*)&msg, 50, IPC_NOWAIT)==-1){
perror("msgsnd");
exit(1);
}
return 0;
}
msgqueuercv.c
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct msgbuf{
long type;
char text[50];
}MsgBuf;
int main(void){
MsgBuf msg;
int msgid, len;
key_t key=1234;
if((msgid=msgget(key, IPC_CREAT|0644))<0){
perror("msgget");
exit(1);
}
len=msgrcv(msgid, (void*)&msg, 50, 0, 0);
printf("Received Message is [%d] %s\n", len, msg.text);
return 0;
}

celina@ubuntuserver:~/celina/IPC_test$ ./msgqueuesnd

celina@ubuntuserver:~/celina/IPC_test$ ./msgqueuercv

Received Message is [50] Hello Message Queue

msgqueuesndrcv.c
하나의 프로그램에서 전송과 수신이 동시에 진행
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct msgbuf{
long type;
char text[50];
}MsgBuf;
int main(void){
int msgid, len;
MsgBuf msg
key_t key=1234;
msgid=msgget(key, IPC_CREAT|0644);
if(msgid==-1){
perror("msgget");
exit(1);
}
msg.type=1;
strcpy(msg.text, "Hello Message Queue");
if(msgsnd(msgid, (void*)&msg, 50, IPC_NOWAIT)==-1){
perror("msgsnd");
exit(1);
}
len=msgrcv(msgid, &msg, 50, 0, 0);
printf("Received Message is '%s' [%d]\n", msg.text, len);
return 0;
}

celina@ubuntuserver:~/celina/IPC_test$ ./msgqueuesndrcv

Received Message is 'Hello Message Queue' [50]